package com.company.example.utils;

import org.springframework.cglib.core.ClassGenerator;
import org.springframework.cglib.core.DefaultGeneratorStrategy;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by ywl on 2016/12/13.
 */
public class ProxyGeneratorUtils {
    /**
     * 获取 JDK代理类的二进制字节码
     * @param clz
     * @return
     */
    public static byte[] getJDKProxyClassBytes(Class<?>[] clz) {
        // 第一种方法，这种方式在刚才分析ProxyGenerator时已经知道了
        // System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", true);
        return ProxyGenerator.generateProxyClass("$Proxy11", clz);
    }

    /**
     * 获取CGLIB代理类的二进制字节码
     * @param cg
     * @return
     */
    public static byte[] getCglibProxyClassBytes(ClassGenerator cg) throws Exception{
        return new DefaultGeneratorStrategy().generate(cg);
    }

    /**
     * 把代理类的字节码写到硬盘上
     * @param path 保存路径
     */
    public static void writeProxyClassToHardDisk(String path, byte[] classFile) {
        // 第一种方法，这种方式在刚才分析ProxyGenerator时已经知道了
        // System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", true);

        FileOutputStream out = null;

        try {
            out = new FileOutputStream(path);
            out.write(classFile);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
